class EvaluadosController < ApplicationController
  # MODULE: Evaluaciones

  before_filter :find_usuario
  before_filter :find_and_update_evaluado_conclucion, :only => [:create, :update]

  def index
    @evaluaciones = Evaluacion.find(:all,:conditions=>"terminada = 0 or terminada is null")
  end

  def show
    @evaluado = Evaluado.find params[:id]
    @datos_evaluador=@evaluado.usuario.datos.find_by_evaluacion_id(@evaluado.evaluacion.id)
    @datos_evaluado=@evaluado.evaluado.datos.find_by_evaluacion_id(@evaluado.evaluacion.id)
    if @evaluado
      @evaluacion = @evaluado.evaluacion
      @preguntas   = @evaluado.evaluado.preguntas.por_evaluacion(@evaluado.evaluacion)
      #@respuestas = @evaluado.respuestas
    else
      redirect_to usuario_evaluados_path(@usuario)
    end
  end

  def create
    @evaluado.conclucion=params[:evaluado][:conclucion].length > 5 ?   params[:evaluado][:conclucion].length : nil
    guardado = Evaluado.crear_evaluacion_para(@usuario, params[:evaluado])
    cant_respuestas=@evaluado.usuario.respuestas.por_evaluacion_y_evaluado(@evaluado.evaluacion,@evaluado.evaluado).count
    cant_preguntas=@evaluado.evaluado.preguntas.por_evaluacion(@evaluado.evaluacion).count
    @evaluado.update_attribute(:conclucion, params[:evaluado][:conclucion])
    @success = @evaluado.valid?
    if guardado && @success
      @evaluado.evaluacion.completar_evaluacion(@evaluado, @usuario)
      if !@success
        flash[:error] = "La conclusion no puede estar en blanco"
        redirect_to evaluar_usuario_evaluados_path(@usuario, :evaluado_id => @evaluado.id, :evaluacion_id => @evaluado.evaluacion_id)
      else
        if cant_respuestas !=cant_preguntas
          flash[:notice] = "Evaluación guardada con éxito! quedan #{cant_preguntas-cant_respuestas} preguntas por responder."
        else
          flash[:notice] = "Evaluación terminada con éxito!"
        end
        redirect_to usuario_evaluado_path(@usuario, @evaluado)
      end

    else
      if !guardado && !@success
        flash[:error] = "Evaluacion como NUNCA, justificar evaluacion.<br />La conclusion no puede estar en blanco."
      elsif !@success
        flash[:error] = "La conclusion no puede estar en blanco"
      else
        flash[:error] = "Evaluacion como NUNCA, justificar evaluacion"
      end
      # render :action => :evaluar
      redirect_to evaluar_usuario_evaluados_path(@usuario, :evaluado_id => @evaluado.id, :evaluacion_id => @evaluado.evaluacion_id)
    end
  end

  def update
    @evaluado.conclucion=params[:evaluado][:conclucion].length > 5 ?   params[:evaluado][:conclucion].length : nil
    guardado = Evaluado.actualizar_evaluacion_para(@usuario, params[:evaluado])
    @evaluado.update_attribute(:conclucion, params[:evaluado][:conclucion])
    @success = @evaluado.valid?
    cant_respuestas=@evaluado.usuario.respuestas.por_evaluacion_y_evaluado(@evaluado.evaluacion,@evaluado.evaluado).count
    cant_preguntas=@evaluado.evaluado.preguntas.por_evaluacion(@evaluado.evaluacion).count
    if guardado && @evaluado && @success
      @evaluado.evaluacion.completar_evaluacion(@evaluado, @usuario)
      if cant_respuestas !=cant_preguntas
        flash[:notice] = "Evaluación guardada con éxito! quedan #{cant_preguntas-cant_respuestas} preguntas por responder."
      else
        flash[:notice] = "Evaluación terminada con éxito!"
      end
      redirect_to usuario_evaluado_path(@usuario, @evaluado)
    else
      if !guardado && !@success
        flash[:error] = "Evaluacion como NUNCA, justificar evaluacion.<br />La conclusion no puede estar en blanco."
      elsif !@success
        flash[:error] = "La conclusion no puede estar en blanco"
      else
        flash[:error] = "Evaluacion como NUNCA, justificar evaluacion"
      end
      redirect_to evaluar_usuario_evaluados_path(@usuario, :evaluado_id => @evaluado.id, :evaluacion_id => @evaluado.evaluacion_id)
    end
  end

  def tomar_evaluacion #DESC: Ingresar a la evaluacion, ver sus usuarios a evaluar.
   # redirect_to :action => :index
   # if false
      @evaluacion = Evaluacion.find params[:evaluacion_id]
      evaluados_por_evaluacion=@usuario.evaluados.por_evaluacion(@evaluacion)
      if evaluados_por_evaluacion.empty? # @evaluacion && !current_user.tiene_perfil?('Administrador')
        @usuario.seleccionar_usuarios(@evaluacion)
        @evaluados  = @usuario.evaluados.por_evaluacion(@evaluacion.id)
      else
        @evaluados  = evaluados_por_evaluacion
      end
      @datos_evaluador=@usuario.datos.find_by_evaluacion_id(@evaluacion.id)
      @datos_evaluado=@evaluados.first.evaluado.datos.find_by_evaluacion_id(@evaluacion.id)
   # end
    #@evaluados  = @usuario.subordinados
  end

  def evaluar #DESC: Evaluar a un determinado usuario.
    @evaluado    = Evaluado.find params[:evaluado_id]
    @evaluacion  = @evaluado.evaluacion
    #@preguntas   = @evaluacion.preguntas.competencias_cargo(@evaluado.usuario_evaluado.cargo_id)  if @evaluacion
    @datos_evaluador=@usuario.datos.find_by_evaluacion_id(@evaluacion.id)
    @datos_evaluado=@evaluado.evaluado.datos.find_by_evaluacion_id(@evaluacion.id)
    @preguntas   = @evaluado.evaluado.preguntas.por_evaluacion(@evaluacion)
    #@competencia = nil
  end

  def agregar #DESC: Agregar un usuario a la lista de usuarios a evaluar de otro usuario.
    @evaluacion       = Evaluacion.find params[:evaluacion_id]
    @usuario_evaluado = Usuario.find params[:usuario_evaluado_id]
    unless @usuario.evalua_a?(@usuario_evaluado, @evaluacion)
      @usuario.crear_evaluacion_para([@usuario_evaluado], params[:tipo], @evaluacion)
    end
    @evaluados = @usuario.evaluados.por_evaluacion(@evaluacion.id)
    respond_to do |format|
      format.js
    end
  end

  def quitar  #DESC: Quitar un usuario de la lista de usuarios a evaluar de otro usuario.
    @evaluado   = Evaluado.find params[:evaluado_id]
    @evaluacion = @evaluado.evaluacion
    if @evaluado
      @usuario_evaluado = Usuario.find @evaluado.evaluado_id
      @evaluacion.borrar_respuestas(@usuario, @usuario_evaluado)
      @evaluado.destroy
    end
  end

  def responder #DESC: Responder una pregunta.
    render :nothing => true
  end

  #HELP: Ver Reporte
  #TODO: MODIFICAR COMO SE OBTIENE EL PUNTAJE
  def puntaje  #DESC: Ver su reporte de puntajes de una determinada evaluacion.
    @evaluacion = Evaluacion.find params[:evaluacion_id]
    if @evaluacion
      
      if params[:refresh_data] && current_user.tiene_perfil?("Administrador")
        @evaluado     = Evaluado.find_all_by_tipo(@evaluacion, @usuario)
        @evaluado.each do |e|
          @evaluacion.completar_evaluacion(e, e.usuario)
        end
        @usuario.asignar_resultado_por_competencia(@evaluacion)
      end
      @usuario_preguntas    = @usuario.usuarios_preguntas.por_evaluacion(@evaluacion)

      #@porcentaje_competencia_esp = @usuario.porcentaje_competencias(@evaluacion,:especifica)
      #@porcentaje_competencia_gen = @usuario.porcentaje_competencias(@evaluacion,:general)

      #      especificas=@usuario_preguntas.select{|p| (p.pregunta.competencia_tipo.match('especifica') and p.resultado>0)}
      #      generales=@usuario_preguntas.select{|p| (p.pregunta.competencia_tipo.match('general') and p.resultado>0)}

      especificas=@usuario_preguntas.select{|p| (p.pregunta.competencia_tipo.match(/especifica/i))}
      generales=@usuario_preguntas.select{|p| (p.pregunta.competencia_tipo.match(/general/i))}

      suma=0
      cantidad=especificas.count
      especificas.each{ |e| suma+=e.resultado.to_f}
      @porcentaje_competencia_esp =  cantidad > 0 ? (suma/(100*cantidad))*100 : 0
      divisor=cantidad > 0 ? 1 : 0
      suma=0
      cantidad=generales.count
      generales.each{ |g| suma+=g.resultado.to_f}
      @porcentaje_competencia_gen = cantidad > 0 ?  (suma/(100*cantidad))*100 : 0
      divisor+=cantidad > 0 ? 1 : 0
      @cuantitativo = divisor > 0 ?  (@porcentaje_competencia_gen + @porcentaje_competencia_esp) / divisor : 0

      @resultado_competencias=@usuario.resultados_competencias.por_evaluacion(@evaluacion)
      cantidad=@resultado_competencias.count
      suma=0
      @resultado_competencias.each{ |p| suma+=p.pares}
      @porcentaje_par = cantidad > 0 ? (suma/(100*cantidad))*100 : 0

      suma=0
      @resultado_competencias.each{ |p| suma+=p.jefes}
      @porcentaje_superior = cantidad > 0 ? (suma/(100*cantidad))*100 : 0

      suma=0
      @resultado_competencias.each{ |p| suma+=p.subordinados}
      @porcentaje_subordinado = cantidad > 0 ? (suma/(100*cantidad))*100 : 0

      suma=0
      @resultado_competencias.each{ |p| suma+=p.autoevaluacion}
      @porcentaje_autoevaluacion = cantidad > 0 ? (suma/(100*cantidad))*100 : 0

      @conclusiones             = Evaluado.find_all_conclusiones(@usuario, @evaluacion)
    end
  end

  def actualizar_preguntas_asignadas
    evaluacion=Evaluacion.find(params[:evaluacion_id])
    @usuario.asignar_preguntas(evaluacion, true)
    redirect_to :action => "puntaje", :evaluacion_id => params[:evaluacion_id]
  end

  def mis_evaluadores #DESC: Ver por quien es evaluado un usuario
    @evaluacion  = Evaluacion.find params[:evaluacion_id]
    @evaluadores = @evaluacion.evaluados.find(:all, :conditions => { :evaluado_id => @usuario.id})
  end

  def comentarios  #IGNORE
    @pregunta = Pregunta.find params[:pregunta_id]
    if @pregunta
      @evaluacion  = @pregunta.evaluacion
      @comentarios = @usuario.comentarios(@pregunta)
    end
  end

  protected

  def find_usuario
    @usuario = Usuario.find params[:usuario_id] || current_user
  end

  def find_and_update_evaluado_conclucion
    @evaluado = Evaluado.find params[:id]
  end
end

